#pragma once

#include"Log.hpp"
#include<cerrno>
#include<cstring>
#include<iostream>
#include<sys/ipc.h>
#include<sys/types.h>
#include<string>
#include<sys/shm.h>
using namespace std;

const int size = 4096;   //4kb
const string pathname = "/home/_mian_yang";
const int proj_id = 0x88881; 
Log log;

//获取key
key_t GetKey()
{
	key_t k = ftok(pathname.c_str(), proj_id);   //ftok拿到k函数
	if (k == -1)  //如果k == -1， 那么就拿到k失败。
	{
		log(Fatal, "ftok error: %s", strerror(errno));  //打印错误信息
		exit(1);
	}
	log(Info, "ftok success! Key is: #d", k);  //创建k成功， 返回k
	return k; 

}

//
int GreatShareMemory(int flag)
{
	key_t key = GetKey(); //获取key
	int shmid = shmget(key, size, flag);
	if (shmid == -1)
	{
		log(Fatal, "creat share memory error: %s", strerror(errno)); //创建共享内存失败， 打印错误消息
		exit(1);
	}
	log(Info, "creat share memory is success! shmget is: %d", shmid); //创建共享内存成功， 打印共享内存的的shmid
	return shmid;
}

int GreatShm()
{
	return GreatShareMemory(IPC_CREAT | IPC_EXCL | 0666); //第一次创建需要判断是否存在
	
}

int GetShm()
{
	return GreatShareMemory(IPC_CREAT); //获取的时候不需要判断是否存在
}
